package com.atguigu.juc.day01;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * @author atguigu-mqx
 */
public class NotSafeDemo {

    //  主入口：
    public static void main(String[] args) {
        //  listDemo();
        //  setDemo();
        //  HashMap<String,String> hashMap = new HashMap<>();
        //  Map<String, String> hashMap = Collections.synchronizedMap(new HashMap<>());
        ConcurrentHashMap<String, String> hashMap = new ConcurrentHashMap<>();

        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                //  添加数据！
                //  stringList.get() add() remove() set()
                hashMap.put(UUID.randomUUID().toString(),UUID.randomUUID().toString());
                //  遍历集合数据：获取集合数据！
                System.out.println(hashMap);
            }, String.valueOf(i)).start();
        }

    }

    private static void setDemo() {
          HashSet<String> setList = new HashSet<>();
        //  Set<String> setList = Collections.synchronizedSet(new HashSet<String>());
//        CopyOnWriteArraySet<String> setList = new CopyOnWriteArraySet<>();
        //  创建线程
        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                //  添加数据！
                //  stringList.get() add() remove() set()
                setList.add(UUID.randomUUID().toString());
                //  遍历集合数据：获取集合数据！
                System.out.println(setList);
            }, String.valueOf(i)).start();
        }
    }

    private static void listDemo() {
        //  证明List 集合在多线程情况下是不安全的！
        //  List<String> stringList = new ArrayList<>();
        //  List<String> stringList = new Vector<>();
        //  List<String> stringList = Collections.synchronizedList(new ArrayList<>());
        //  写时复制技术： 读和写在不同的容器！
        CopyOnWriteArrayList<String> stringList = new CopyOnWriteArrayList<>();
        //  创建多线程
        for (int i = 0; i < 30; i++) {
            //  cpu 分配资源！
            new Thread(() -> {
                //  添加数据！
                //  stringList.get() add() remove() set()
                stringList.add(UUID.randomUUID().toString());
                //  遍历集合数据：获取集合数据！
                System.out.println(stringList);
            }, String.valueOf(i)).start();
        }

        //  集合安全框架：
    }
}
